package com.xx.chb01.rabbitmq.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DirectExchangeConfig {

    /**

         * DirectExchange是RabbitMQ Broker的默认Exchange，
         * 它有一个特别的属性对一些简单的应用来说是非常有用的，
         * 在使用这个类型的Exchange时，
         * 可以不必指定routing key的名字，在此类型下创建的Queue有一个默认的routing key，
         * 这个routing key一般同Queue同名。
         *
         * 适用场景：
         *         这种类型的Exchange，通常是将同一个message以一种循环的方式分发到不同的Queue，即不同的消费者手中，使用这种方式，
         *         值得注意的是message在消费者之间做了一个均衡，而不是说message在Queues之间做了均衡
         *
         * 支持：
         *  1.单个绑定
         *  2.多个绑定

    **/

    static final String ExchangeName = "spring-boot-exchange";

    //交换机的名字绝对不能重复
    @Bean
    DirectExchange directExchange() {
        return new DirectExchange(ExchangeName);
    }

////////////////////////////////一个是pointQueue，积分队列。另一个是performanceQueue，业绩队列。/////////////////////////////
    static final String pointQueueName = "point";
    static final String performanceQueueName = "performance";
    @Bean
    Queue performanceQueue() {
        return new Queue(performanceQueueName, true);
    }

    @Bean
    Queue pointQueue() {
        return new Queue(pointQueueName, true);
    }

    //将两个Queue绑定到交换器上。
    // 这里BindingBuilder的with方法，
    // 即routingKey是我们的路由键，交换器将根据这里定义的路由键规则进行队列消息的分发。


    @Bean
    Binding bindingPerformance(Queue performanceQueue, DirectExchange exchange) {
        return BindingBuilder.bind(performanceQueue)
                .to(exchange)
                .with(performanceQueueName);
    }


    @Bean
    Binding bindingPointQueue(Queue pointQueue, DirectExchange exchange) {
        return BindingBuilder.bind(pointQueue)
                .to(exchange)
                .with(pointQueueName);
    }



 }